package com.sourcemuch.im.caiba;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.xiaomi.mipush.sdk.ErrorCode;
import com.xiaomi.mipush.sdk.MiPushClient;
import com.xiaomi.mipush.sdk.MiPushCommandMessage;
import com.xiaomi.mipush.sdk.MiPushMessage;
import com.xiaomi.mipush.sdk.PushMessageReceiver;

import org.json.JSONException;

import java.util.List;

import cn.wildfirechat.client.NotInitializedExecption;
import cn.wildfirechat.push.AndroidPushMessage;
import cn.wildfirechat.push.PushService;
import cn.wildfirechat.remote.ChatManager;

/**
 * 1、PushMessageReceiver 是个抽象类，该类继承了 BroadcastReceiver。<br/>
 * 2、需要将自定义的 DemoMessageReceiver 注册在 AndroidManifest.xml 文件中：
 * <pre>
 * {@code
 *  <receiver
 *      android:name="com.xiaomi.mipushdemo.DemoMessageReceiver"
 *      android:exported="true">
 *      <intent-filter>
 *          <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
 *      </intent-filter>
 *      <intent-filter>
 *          <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
 *      </intent-filter>
 *      <intent-filter>
 *          <action android:name="com.xiaomi.mipush.ERROR" />
 *      </intent-filter>
 *  </receiver>
 *  }</pre>
 * 3、DemoMessageReceiver 的 onReceivePassThroughMessage 方法用来接收服务器向客户端发送的透传消息。<br/>
 * 4、DemoMessageReceiver 的 onNotificationMessageClicked 方法用来接收服务器向客户端发送的通知消息，
 * 这个回调方法会在用户手动点击通知后触发。<br/>
 * 5、DemoMessageReceiver 的 onNotificationMessageArrived 方法用来接收服务器向客户端发送的通知消息，
 * 这个回调方法是在通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数。<br/>
 * 6、DemoMessageReceiver 的 onCommandResult 方法用来接收客户端向服务器发送命令后的响应结果。<br/>
 * 7、DemoMessageReceiver 的 onReceiveRegisterResult 方法用来接收客户端向服务器发送注册命令后的响应结果。<br/>
 * 8、以上这些方法运行在非 UI 线程中。
 * <p>
 * Create by HEKE, 2019/8/19 16:51
 * TODO 自定义小米端推送广播
 */
public class MyXiaoMiMessageReceiver extends PushMessageReceiver {

    private String mRegId;
    private long mResultCode = -1;
    private String mReason;
    private String mCommand;
    private String mMessage;
    private String mTopic;
    private String mAlias;
    private String mUserAccount;
    private String mStartTime;
    private String mEndTime;

    @Override
    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
        mMessage = message.getContent();
        AndroidPushMessage pushMessage = null;
        try {
            pushMessage = AndroidPushMessage.messageFromJson(mMessage);
            PushService.didReceiveIMPushMessage(context, pushMessage, PushService.PushServiceType.Xiaomi);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        if (!TextUtils.isEmpty(message.getTopic())) {
            mTopic = message.getTopic();
        } else if (!TextUtils.isEmpty(message.getAlias())) {
            mAlias = message.getAlias();
        } else if (!TextUtils.isEmpty(message.getUserAccount())) {
            mUserAccount = message.getUserAccount();
        }
        /**
         * modify by HEKE , 2019/8/24 15:27
         * TODO 回传信息至主程序处理，透传类型
         */
        if (InterfaceReceiversHub.hKpushsdkinterface != null) {
            InterfaceReceiversHub.hKpushsdkinterface.receiveMessage(mMessage, HKpushsdkinterface.PassThrough);
        }
    }

    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        PushService.showMainActivity(context);
        /**
         * modify by HEKE , 2019/8/24 15:27
         * TODO 回传信息至主程序处理，点击通知类型
         */
        if (InterfaceReceiversHub.hKpushsdkinterface != null) {
            InterfaceReceiversHub.hKpushsdkinterface.receiveMessage(mMessage, HKpushsdkinterface.NotificationClick);
        }
    }

    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        mMessage = message.getContent();
        if (!TextUtils.isEmpty(message.getTopic())) {
            mTopic = message.getTopic();
        } else if (!TextUtils.isEmpty(message.getAlias())) {
            mAlias = message.getAlias();
        } else if (!TextUtils.isEmpty(message.getUserAccount())) {
            mUserAccount = message.getUserAccount();
        }
        /**
         * modify by HEKE , 2019/8/24 15:27
         * TODO 回传信息至主程序处理，通知接收类型
         */
        if (InterfaceReceiversHub.hKpushsdkinterface != null) {
            InterfaceReceiversHub.hKpushsdkinterface.receiveMessage(mMessage, HKpushsdkinterface.NotificationMessageArrived);
        }
    }

    @Override
    public void onCommandResult(Context context, MiPushCommandMessage message) {
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
        String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
            }
        } else if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAlias = cmdArg1;
            }
        } else if (MiPushClient.COMMAND_UNSET_ALIAS.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAlias = cmdArg1;
            }
        } else if (MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mTopic = cmdArg1;
            }
        } else if (MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mTopic = cmdArg1;
            }
        } else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mStartTime = cmdArg1;
                mEndTime = cmdArg2;
            }
        }
        Log.e("#### onCommandResult ", "  mRegId : " + mRegId + " , mAlias : " + mAlias + " , mTopic " + mTopic);
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
        String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
                try {
                    ChatManager.Instance().setDeviceToken(mRegId, ChatManager.PushType.Xiaomi);
                } catch (NotInitializedExecption notInitializedExecption) {
                    notInitializedExecption.printStackTrace();
                }
            }
        }
        /**
         * modify by HEKE , 2019/8/24 15:27
         * TODO 回传信息至主程序处理，发送指令响应类型
         */
        if (InterfaceReceiversHub.hKpushsdkinterface != null) {
            InterfaceReceiversHub.hKpushsdkinterface.receiveMessage(command, HKpushsdkinterface.ReceiveRegisterResult);
        }
    }
}
